#ifndef TTS_H
#define TTS_H
#include "Arduino.h"
#include "UTF8ToGB2312.h"
#include <SoftwareSerial.h>

EspSoftwareSerial::UART myPort;
void speech(String data)
{
    // 0--空闲  1--繁忙  2--异常
    String utf8_str = data;
    String gb2312_str = GB.get(utf8_str);
    unsigned char head[gb2312_str.length() + 6];
    // 定义无符号字符类型数组，将 GB2312 编码的字符串复制到数组中
    unsigned char gb2312_data[gb2312_str.length() + 1];
    memset(gb2312_data, 0, sizeof(gb2312_data));
    strncpy((char *)gb2312_data, gb2312_str.c_str(), gb2312_str.length());
    // head byte
    head[0] = 0xFD;
    // length bytes
    unsigned int dat_len = gb2312_str.length() + 3;
    head[1] = dat_len >> 8;
    head[2] = dat_len;
    // cmd byte
    head[3] = 0x01;
    // para byte
    head[4] = 0x01;
    // send each character individually
    for (int i = 0; i < gb2312_str.length(); i++)
    {
        head[i + 5] = gb2312_data[i];
    }
    // 计算异或值并添加到数组，额这个是syn那个芯片的例程，这个异或计算有没有用我懒得改了。反正代码能跑。
    head[gb2312_str.length() + 5] = head[0];
    for (int i = 1; i < gb2312_str.length() + 5; i++)
    {
        head[gb2312_str.length() + 5] ^= head[i];
    }
    // 发送字符数组到串口
    for (int j = 0; j < gb2312_str.length() + 6; j++)
    {
        myPort.write(head[j]);
    }
    delay(gb2312_str.length() * 130);
    // Serial.println(data);
}
// 查询tts合成工作状态 返回1表示繁忙 0表示空闲
int workstate(void)
{
    unsigned char head[4] = {0xFD, 0x00, 0x01, 0x21};
    // 发送字符数组到串口
    for (int j = 0; j < 4; j++)
    {
        myPort.write(head[j]);
    }

    // 等待myPort的返回
    while (myPort.available() < 1)
    {
        // 可以在这里加入一些延时，以防止过快地查询
        delay(150);
    }

    // 读取并处理返回的数据
    byte response = myPort.read();

    // 返回相应的状态值
    if (response == 0x4E)
    {
        // 繁忙
        return 1;
    }
    else if (response == 0x4F)
    {
        // 空闲
        return 0;
    }
    else
    {
        // 未知状态，可以根据需要进行处理
        return 2;
    }
}

void word_cut(String answer)
{
    // 切片句子输出，检测到。！？；：符号切割句子
    int index = 0;
    int len = answer.length();
    for (int i = 0; i < len; i++)
    {
        if (answer[i] == '，' || answer[i] == '。' || answer[i] == '？' || answer[i] == '！' || answer[i] == '：')
        {
            speech(answer.substring(index, i+1));
            index = i + 1;
        }
    }
    if (index < len)
    {
        speech(answer.substring(index, len));
    }
}
#endif // TTS_H
